<?php 
/* Classe Basket 
 * Gestion des paniers d'achat de la boutique
 * Auteur: Elmsroth 
 * © 2010 killingspree Network
 */

class Basket //_____ Fonctionnement basé sur les cookies
{
	/* Cookie = nom /valeur
	 *  ICI la valeur sera utilisée pour stoker les infos
	 *  un "achat" est sybolisé par : IdItemXqtyDdateAdd
	 *  Chaque achat separé par une virguleex: 12X1D01640 12550X3D500  etc... = $achats
	 *  cookie = total::achats
	 *  La tableau : objet = clé
	 *  			  / \
	 *  			ID  Date ajout
	 */
	
	private static $BasketInstance = null;
	
	/**********************************************
	 *                                            *
	 * 	  FONCTIONS DE CREATION & DESTRUCTION	  *
	 * 											  *
	 * -------------------------------------------*/
	
	private function __construct()
	{
	
	}
	
	public static function getInstance()
	{
		 if(is_null(self::$BasketInstance)) 
		 {
			self::$BasketInstance = new Basket();
		}
			return self::$BasketInstance;
	}
	public function trash() 
	//Détruit le Panier en vidant le cookie
	{
		
		$flag = setcookie(COOKIE_BASKET, "", time() - 86400, "/", ".killingspree.fr");
	
		 return $flag;
	}
	
	/**********************************************
	 *                                            *
	 * 		AJOUT ET SUPPRESSION D'OBJETS		  *
	 * 											  *
	 * -------------------------------------------*/
	public function getItems()
	{
		return $this->getArray();
	}
	
	
	public function addItem($item,$qty,$type= TYPE_SHOP_ITEM) 
	//on ajoute un item au panier OR ARGENT OU AUTRE
	{
		
			$tab = $this->getArray();
			
			if(!$this->contains($item, $tab))
			{
				$tab[] = array("TYPE" => $type , "ITEM"=> $item, "QTY" =>$qty, "DATE_ADD" =>time());
			
				$this->compile($tab) ;
			}
			else
			{
				if(is_array($tab))
				{
					$i=0;
					$seek = 0;
					foreach($tab as $tmp)
					{
						if($tmp["ITEM"] == $item) 
						{
							$seek = $i;
							break;
						}
						$i++;
					}
					
					//on definit le tab
					$tab[$i]["QTY"] = $tab[$i]["QTY"] + $qty;
					$this->compile($tab) ;
				}
			}
		
		//on ajoute l'objet au tableau du panier
		//on recompile le cookie
		
	}
	public function contains($item,$tab)
	{
		if(is_array($tab))
		{
			foreach($tab as $tmp)
			{
				if($tmp["ITEM"] == $item) return true;
			}
			
			return false;
		}
		
		return false;
	}
	public function isLegal()
	{
		//shop:: containsItem($item) à mapper sur le tableau
		$tab = $this->getArray();
		
		if(is_array($tab))
		{
			foreach($tab as $item )
			{
				if(!shop::containsItem($item["ITEM"]) AND $item["ITEM"] != -55 ) return false;
			}
			return true;
		}
		
	}
	
	public function deleteItem($item) 
	//Supprime un objet du panier
	{
		
		
		$tab = $this->getArray();
		if(is_array($tab))
		{
			$i=0;
			$seek = 0;
			foreach($tab as $tmp)
			{
				if($tmp["ITEM"] == $item) 
				{
					$seek = $i;
					break;
				}
				$i++;
			}
			
			
			//on definit le tab
			unset($tab[$i]);
			$this->compile($tab) ;
			
			
		}
	}

	public function getTotalPrice()
	{
		$items = $this->getArray();
		
		$totalPrice = 0;
						
		//on calcule  le total du panier
		if(is_array($items))
		{
			foreach($items as $tmp)
			{
				
				if($tmp["ITEM"] == -55)
				{
					$totalPrice +=  ceil($tmp["QTY"] * core::getSiteConfVal("goldBuyPVcoef"));
				}
				else
				{
					$tmpItem = new ShopItem();
					$tmpItem->getByKey($tmp["ITEM"]);
					$totalPrice +=  $tmp["QTY"] * $tmpItem->price_pv;
				}
				
			}
		}
		
		return $totalPrice ;
			
	}
	
	public function getTotalArticles()
	{
		$items = $this->getArray();
		
		$totalArts = 0;
						
		//on calcule  le total du panier
		if(is_array($items))
		{
			foreach($items as $tmp)
			{
				if($tmp["ITEM"] == -55)
				{
					$totalArts +=  1 ;
				}
				else
				{
					$totalArts +=  $tmp["QTY"];
				}
			}
		}
		
		return $totalArts ;
		
	}
	
	
	/**********************************************
	 *                                            *
	 * 				HANDLERS DE CHAINE			  *
	 * 											  *
	 * -------------------------------------------*/
	public function getToken() 
	//panier stringifié crypté
	{
		return strtoupper(sha1($_COOKIE[COOKIE_BASKET]));
	}
	
	public function getSerializedForm()
	{
		return $_COOKIE[COOKIE_BASKET];
	}
	
	/**********************************************
	 *                                            *
	 * 				HANDLERS DE & COMPILS		  *
	 * 											  *
	 * -------------------------------------------*/
	private function uncompile($str) 
	//Decompile la chaine
	{
		$tmpTab = NULL;
		$buyTab  = explode(" ",$str); //on obtien un tableau avec des items "12X1D01640"
		if(is_array($buyTab))
		{
			foreach($buyTab as $buy)
			{
				if(strlen($buy) > 5)
				{
					$split0 =  explode("_", $buy);
					$split1 =  explode("X", $split0[1]);
					$item = $split1[0] ;
					$split2 =  explode("D", $split1[1]);
					$qty = $split2[0] ;
					$date = $split2[1] ;
					
					$tmpTab[] = array("TYPE" => $split0[0], "ITEM" =>$item , "QTY" =>$qty, "DATE_ADD" =>$date);
				}
				
			}
			return $tmpTab;
		}
		else return "";
		
	}
	private function getArray()
	{
		
		return $this->uncompile($_COOKIE[COOKIE_BASKET]);
	}
	
	private function compile($tab) 
	//on compile le tableau courant en String unifiée puis on la stocket dan sle cookie
	{	
		if(is_array($tab))
		{
			$str = "";
			$tmpTab= array();
			foreach ($tab as $item)
			{
				$tmpTab[] = $item['TYPE'] ."_". $item['ITEM'] . "X" . $item["QTY"] . "D" . $item["DATE_ADD"]  ;
			}
			
			$str = implode(" ", $tmpTab);
			
			
			setcookie(COOKIE_BASKET, $str, time() + 86400, "/", ".killingspree.fr");
			return $str;
		}
		else 
		{
			setcookie(COOKIE_BASKET, "", time() + 86400, "/", ".killingspree.fr");
			return "";
		}
		
		
		
	}
	

	
}


?>